MODULE GEOMVAR
!
! Verwendungszweck:
!
!      Bereitstellung geometrische Hilfsvariablen wie Volumina und Fluesse
!
!-----------------------------------------------------------------------
! Interne Variable:
!
!     S_vol     : Volumen der skalaren Zelle
!     S_volA    : Volumen der skalaren Zelle zum alten Zeitpunkt
!     S_volZ    : Volumen der skalaren Zelle zum zentrierten Zeitpunkt
!     S_flux    : Advektiver Fluss ueber die (skalare) Zellgrenze am Radiuspunkt r_(i)
!     S_flag    : Flag fuer das Vorzeichen von S_flux
!
!     V_vol     : Volumen der vektoriellen Zelle
!     V_volA    : Volumen der vektoriellen Zelle zum alten Zeitpunkt
!     V_volZ    : Volumen der vektoriellen Zelle zum zentrierten Zeitpunkt
!     V_flux    : Advektiver Fluss ueber die (vektorielle) Zellgrenze am Radiuspunkt r_(i+1/2)
!     V_flag    : Flag fuer das Vorzeichen von V_flux
!
!-----------------------------------------------------------------------

      use config, only : rkind, np

      implicit none

      private
      public :: GEOMET, S_vol, S_volA, S_volZ, S_flux, S_flag, V_vol, V_volA, V_volZ, V_flux, V_flag

      real(kind=rkind)    :: S_vol(np), S_volA(np), S_volZ(np), S_flux(np), S_flag(np)
      real(kind=rkind)    :: V_vol(np), V_volA(np), V_volZ(np), V_flux(np), V_flag(np)

CONTAINS





SUBROUTINE GEOMET
!
! Verwendungszweck:
!
!     Berechnung von Hilfsgroessen zur Aufstellung des Gleichungssystems
!
!          In der vorliegenden Routine werden ausschliesselich geometrische Hilfsgroessen - Volumina & Fluesse -
!          berechnet. Dieser Teil ist daher vollkommen unabhaengig von jeder physikalischen Gleichung.
!
!-----------------------------------------------------------------------
! Interne Variable:
!
!   idx         : Schleifenindex
!
!-----------------------------------------------------------------------

      use primvar, only : X, XA, XZ, MR, MUr
      use config,  only : np
      use global,  only : tst
      use physco,  only : pi, z12, z0, z1, z2, grav


      implicit none

      integer     :: idx


      !$OMP PARALLEL DO PRIVATE (idx)
      do idx = 2,np-2

!-----------------------------------------------------------------------
!    Berechnung der Volumina & Fluesse fuer skalare Groessen
!-----------------------------------------------------------------------

         S_vol(idx)    = pi * (  X(MR,idx+1) -  X(MR,idx) )*(  X(MR,idx+1) +  X(MR,idx) )
         S_volA(idx)   = pi * ( XA(MR,idx+1) - XA(MR,idx) )*( XA(MR,idx+1) + XA(MR,idx) )
         S_volZ(idx)   = pi * ( XZ(MR,idx+1) - XZ(MR,idx) )*( XZ(MR,idx+1) + XZ(MR,idx) )

! Vorzeichenkonvention:  Positive Volumina entsprechen einer Stroemung nach aussen

         S_flux(idx)   = z2*pi * XZ(MR,idx) * XZ(MUr,idx) * tst &
                       - pi * ( X(MR,idx) - XA(MR,idx) )*( X(MR,idx) + XA(MR,idx) )



!-----------------------------------------------------------------------
!    Berechnung der Volumina & Fluesse fuer vektorielle Groessen
!-----------------------------------------------------------------------

         V_vol(idx)    = z12*pi * (  X(MR,idx+1) -  X(MR,idx-1) )*(  X(MR,idx+1) +  X(MR,idx-1) )
         V_volA(idx)   = z12*pi * ( XA(MR,idx+1) - XA(MR,idx-1) )*( XA(MR,idx+1) + XA(MR,idx-1) )
         V_volZ(idx)   = z12*pi * ( XZ(MR,idx+1) - XZ(MR,idx-1) )*( XZ(MR,idx+1) + XZ(MR,idx-1) )

! Vorzeichenkonvention:  Positive Volumina entsprechen einer Stroemung nach aussen

         V_flux(idx)   = pi * ( XZ(MR,idx)*XZ(MUr,idx) + XZ(MR,idx+1)*XZ(MUr,idx+1) ) * tst &
                       - z12*pi * (  ( X(MR,idx)   - XA(MR,idx)   )*( X(MR,idx)   + XA(MR,idx)   ) + &
                                     ( X(MR,idx+1) - XA(MR,idx+1) )*( X(MR,idx+1) + XA(MR,idx+1) )  )


      end do
      !$OMP END PARALLEL DO



!-----------------------------------------------------------------------
!    Schalter fuer die advektiven Fluesse
!-----------------------------------------------------------------------

      where ( S_flux(:) > z0 )
         S_flag(:) = z1
      elsewhere
         S_flag(:) = z0
      end where

      where ( V_flux(:) > z0 )
         V_flag(:) = z1
      elsewhere
         V_flag(:) = z0
      end where



END SUBROUTINE GEOMET


END MODULE GEOMVAR
